package com.xnfh.home.utils

import android.content.Context
import android.graphics.Color
import android.graphics.Typeface
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.components.Legend
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.formatter.IAxisValueFormatter
import com.xnfh.framework.bean.HomeTongjiBean
import com.xnfh.home.R
import com.xnfh.home.widget.CustomBarChartRender
import kotlin.math.pow

/**
 * @Description:
 * @Author: ziheng
 * @CreateDate: 2024/1/3 09:30
 * @UpdateUser: ziheng
 * @UpdateDate: 2024/1/3 09:30
 * @UpdateRemark: 更新说明
 */
object ChartHelper{

    fun setChart(context: Context,homeBarChart: BarChart?,homeTongji: HomeTongjiBean){
        setXAxis(context, homeBarChart)
        setYAxis(context, homeBarChart)
        setChartDetail(context, homeBarChart, homeTongji)
    }

    private fun setChartDetail(context: Context,homeBarChart: BarChart?,homeTongji: HomeTongjiBean) {
        val barEntrys = ArrayList<BarEntry>()
        //这里预警和遥感数据比较大，所以计算出其他两个最大数的位数加1位，然后-1作为做大直
        val maxNum = if (homeTongji.deviceWeatherCount.toInt() > homeTongji.soilCount){
            if(10.0.pow(homeTongji.deviceWeatherCount.length.toDouble()).toInt() / 2 > homeTongji.deviceWeatherCount.toInt()){
                10.0.pow(homeTongji.deviceWeatherCount.length.toDouble()).toInt() / 2
            }else{
                10.0.pow(homeTongji.deviceWeatherCount.length.toDouble()).toInt() - 1
            }
        }else{
            if(10.0.pow(homeTongji.soilCount.toString().length.toDouble()).toInt() / 2 > homeTongji.soilCount){
                10.0.pow(homeTongji.soilCount.toString().length.toDouble()).toInt() / 2
            }else{
                10.0.pow(homeTongji.soilCount.toString().length.toDouble()).toInt() - 1
            }
        }
        // 生成同位数的最大值
        barEntrys.add(BarEntry(0f, if(homeTongji.framTypeCount.toInt() > maxNum){maxNum.toFloat()}else{homeTongji.framTypeCount.toFloat()}))
        barEntrys.add(BarEntry(1f, homeTongji.deviceWeatherCount.toFloat()))
        barEntrys.add(BarEntry(2f, homeTongji.soilCount.toFloat()))
        barEntrys.add(BarEntry(3f, if(homeTongji.tidingCount.toInt() > maxNum){maxNum.toFloat()}else{homeTongji.tidingCount.toFloat()}))
        val barDataSet = BarDataSet(barEntrys, "")
        //依次设置每次柱块的颜色,int... 类型
        barDataSet.setColors(
            context.resources.getColor(R.color.color_FFD159), context.resources.getColor(R.color.color_3785FF),
            context.resources.getColor(R.color.color_00D4E1), context.resources.getColor(R.color.color_FF7572)
        )
        //设置住块上文字的颜色
        barDataSet.valueTextColor = context.resources.getColor(R.color.color_001851)
        //设置住块上文字的大小
        barDataSet.valueTextSize = 13f
        //设置住块上文字的类型，如加粗
        barDataSet.valueTypeface = Typeface.DEFAULT_BOLD
        barDataSet.setValueFormatter { value, entry, dataSetIndex, viewPortHandler ->
            when (entry.x) {
                0f -> {
                    return@setValueFormatter homeTongji.framTypeCount
                }
                3f -> {
                    return@setValueFormatter homeTongji.tidingCount
                }
                else -> {
                    return@setValueFormatter value.toInt().toString()
                }
            }
        }
        barDataSet.form = Legend.LegendForm.NONE // 设置不展示lable的图形
        val barData = BarData(barDataSet)
        barData.barWidth = 0.5F
        //设置x和y两个方向的动画，也可以单独设置x和y方向上的动画，但同时设置效果更好看
        homeBarChart?.animateXY(1500, 1500)
        val customBarChartRender = CustomBarChartRender(
            homeBarChart,
            homeBarChart?.animator,
            homeBarChart?.viewPortHandler
        )
        customBarChartRender.setRadius(20)
        homeBarChart?.renderer = customBarChartRender
        //是否将柱块上的文字绘制在柱块的上面
        homeBarChart?.setDrawValueAboveBar(true)
        homeBarChart?.setTouchEnabled(false)//是否取消所有的手势操作，包括点击和缩放，bool值
        homeBarChart?.setFitBars(true)//是否处理超出的柱块（这是个非常重要的属性，有时候可以帮助我们自动处理超出的柱块），一般都会加上
        homeBarChart?.data = barData
        val description = homeBarChart?.description
        description?.text = ""
        homeBarChart?.invalidate()
    }


    private fun setXAxis(context: Context,homeBarChart: BarChart?) {
        //得到xAxis对象
        val xAxis: XAxis = homeBarChart?.xAxis!!
        //设置x轴是显示在顶部还是底部，柱状图内还是外
        xAxis.position = XAxis.XAxisPosition.BOTTOM
        //设置文字旋转的角度
        xAxis.labelRotationAngle = 0f
        //设置最小值，可通过该属性设置与左边的距离
        xAxis.axisMinimum = -0.8f
        //设置最大值
        xAxis.axisMaximum = 3.7f
        xAxis.labelCount = 4
        //设置靠近x轴第一条线的颜色
        //xAxis.axisLineColor = Color.RED
        //设置绘制靠近x轴的第一条线的宽度
        xAxis.axisLineWidth = 1f
        //是否绘制横向的网格
        xAxis.setDrawGridLines(false)

        //自定义格式
        xAxis.valueFormatter =
            IAxisValueFormatter { value, axis ->
                when (value.toInt()) {
                    0 -> {
                        context.resources.getString(R.string.str_home_wxfw)
                    }

                    1 -> {
                        context.resources.getString(R.string.str_home_wrj_fw)
                    }

                    2 -> {
                        context.resources.getString(R.string.str_home_ct_fw)
                    }

                    3 -> {
                        context.resources.getString(R.string.str_home_yj_fw)
                    }

                    else -> {
                        ""
                    }
                }
            }
        //设置x轴在y方向上的偏移量
        xAxis.yOffset = 10f
        //设置x轴字体大小
        xAxis.textSize = 13f
        //设置x轴字体颜色
        xAxis.textColor = context.resources.getColor(R.color.color_001851)
        xAxis.granularity = 1f
        xAxis.isGranularityEnabled = true
    }

    private fun setYAxis(context: Context,homeBarChart: BarChart?) {
        //不显示右侧的y轴
        homeBarChart?.getAxisRight()?.setEnabled(false)

        //得到左侧的y轴对象
        val yAxis: YAxis = homeBarChart?.getAxisLeft()!!
        //是否绘制最上面的那个标签
        yAxis.setDrawTopYLabelEntry(false)
        yAxis.axisMinimum = 0f
//        yAxis.axisMaximum = 20f
        //设置标签是绘制在图形内部还是外部， YAxisLabelPosition枚举值
        yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
        //设置靠近y轴第一条线的宽度
        yAxis.axisLineWidth = 0f
        //设置靠近y轴第一条线的颜色
        yAxis.axisLineColor = Color.TRANSPARENT
        //设置Y轴的线条颜色
        yAxis.gridColor = context.resources.getColor(R.color.color_f6f6f6)
        //设置横向网格线的宽度
        yAxis.gridLineWidth = 1f

        //设置y轴在x方向上的偏移量
        yAxis.xOffset = 0f
        //设置y轴的字体大小
        yAxis.textSize = 10f
        //设置y轴的字体颜色
        yAxis.textColor = context.resources.getColor(R.color.color_001851)
        //设置y轴字体的类型，如加粗等
        //yAxis.typeface = Typeface.DEFAULT_BOLD
        //自定义样式
        yAxis.valueFormatter =
            IAxisValueFormatter { value, axis -> "${value.toInt()}" }
    }


}